/*-------------------------------------------------------------------------
 *
 * executor_util.h
 *	  Utility functions for executing task lists.
 *
 *-------------------------------------------------------------------------
 */
#ifndef EXECUTOR_UTIL_H
#define EXECUTOR_UTIL_H

#include "fmgr.h"
#include "funcapi.h"

#include "access/tupdesc.h"
#include "nodes/params.h"
#include "nodes/pg_list.h"

#include "distributed/multi_physical_planner.h"

/* utility functions for dealing with tasks in the executor */
extern bool TaskListModifiesDatabase(RowModifyLevel modLevel, List* taskList);
extern bool TaskListRequiresRollback(List* taskList);
extern bool TaskListRequires2PC(List* taskList);
extern bool TaskListCannotBeExecutedInTransaction(List* taskList);
extern bool SelectForUpdateOnReferenceTable(List* taskList);
extern bool ReadOnlyTask(TaskType taskType);
extern bool ModifiedTableReplicated(List* taskList);
extern bool ShouldRunTasksSequentially(List* taskList);

/* utility functions for handling parameters in the executor */
extern void ExtractParametersForRemoteExecution(ParamListInfo paramListInfo,
                                                Oid** parameterTypes,
                                                const char*** parameterValues);
extern void ExtractParametersFromParamList(ParamListInfo paramListInfo,
                                           Oid** parameterTypes,
                                           const char*** parameterValues,
                                           bool useOriginalCustomTypeOids);

/* utility functions for processing tuples in the executor */
extern AttInMetadata* TupleDescGetAttBinaryInMetadata(TupleDesc tupdesc);
extern HeapTuple BuildTupleFromBytes(AttInMetadata* attinmeta, fmStringInfo* values);

#endif /* EXECUTOR_UTIL_H */
